home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prsave.c < prev    next >
C/C++ Source or Header  |  1995-05-08  |  3KB  |  145 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. #include "prtrans.h"
  5.  
  6. #if !defined(__MAIN_C__)
  7. #define main    main_prsave
  8. #endif
  9.  
  10. unsigned char buffer[65536];
  11.  
  12. int main (int argc, char **argv);
  13.  
  14. int main (int argc, char **argv) {
  15.   unsigned long start, end, length;
  16.   unsigned driveraddr, basicaddr;
  17.   FILE *file = stdout;
  18.   unsigned bank = 0;
  19.   char **parameters = argv;
  20.   baseaddr = portaddr[DEFAULT_PORT];
  21.  
  22.   while (*++parameters && **parameters == '-') { /* check for options */
  23.     if (parameters[0][1] == '-') { /* "--" ends options */
  24.       parameters++;
  25.       break;
  26.     }
  27.  
  28.     switch (parameters[0][1]) {
  29.     case 'b':
  30.       bank = strtoul (*++parameters, NULL, 16);
  31.  
  32.       if (bank > 255) {
  33.     fprintf (stderr, "%s: Illegal memory bank specified.\n", *argv);
  34.     return 1;
  35.       }
  36.  
  37.       break;
  38.  
  39.     case 'p':
  40.       baseaddr = strtoul (*++parameters, NULL, 16);
  41.  
  42.       if (baseaddr > 3) {
  43.     fprintf (stderr, "%s: The printer port number must be between 0 and 3.\n",
  44.              *argv);
  45.     return 1;
  46.       }
  47.  
  48.       baseaddr = portaddr[baseaddr];
  49.  
  50.       break;
  51.  
  52.     case '?':
  53.     case 'h':
  54.     Usage:
  55.       fprintf (stderr, "%s: Dumps a memory area on a remote "
  56.                "computer to a file or standard output.\n\n", *argv);
  57.       fprintf (stderr, "Usage: %s [options] startaddress endaddress [filename]\n",
  58.                *argv);
  59.       fprintf (stderr, "Options:\n\t"
  60.              "-b bank\t"
  61.                  "Specify the memory bank (in hex)\n\t"
  62.              "-p port\t"
  63.                  "Specify the printer port (0 to 3)\n");
  64.       return 1;
  65.  
  66.     default:
  67.       fprintf (stderr, "%s: Illegal option `%s'.\n", *argv, *parameters);
  68.       goto Usage;
  69.     }
  70.   }
  71.  
  72.   if (!*parameters) goto Usage;
  73.  
  74.   start = strtoul (*parameters++, NULL, 16);
  75.  
  76.   if (!*parameters) goto Usage;
  77.  
  78.   end = strtoul (*parameters++, NULL, 16);
  79.  
  80. #ifdef WRAP_AROUND
  81.   if (start & ~65535 || end & ~65535)
  82.     goto Usage;
  83. #else
  84.   if (start & ~65535 || end & ~65535 || (start >= end && end))
  85.     goto Usage;
  86. #endif /* WRAP_AROUND */
  87.  
  88.   if (prinit()) {
  89.     fprintf (stderr, "%s: Could not get the I/O permissions.\n", *argv);
  90.     return 4;
  91.   }
  92.  
  93.   if (*parameters) { /* a file name was specified */
  94.     if (parameters[1])
  95.       goto Usage; /* more than one filename specified */
  96.  
  97.     if (!(file = fopen(*parameters, "wb"))) {
  98.       fprintf (stderr, "%s: Could not open the file `%s'.\n", *argv,
  99.                *parameters);
  100.       return 5;
  101.     }
  102.   }
  103.  
  104.   output (REQ_INFO); /* request machine info */
  105.  
  106.   fprintf (stderr, "%s: machine type %u.\n", *argv, wait_input ());
  107.  
  108.   driveraddr = wait_input();
  109.   driveraddr |= wait_input() << 8;
  110.   basicaddr = wait_input();
  111.   basicaddr |= wait_input() << 8;
  112.  
  113.   fprintf (stderr, "%s: Driver address %04X, BASIC start address %04X.\n",
  114.            *argv, driveraddr, basicaddr);
  115.  
  116.   output (REQ_SAVE); /* op code for download */
  117.   output (bank); /* bank address */
  118.  
  119.   if (wait_input ()) {
  120.     fprintf (stderr, "%s: not ready to transfer\n", *argv);
  121.     return 6;
  122.   }
  123.   else
  124.     fprintf (stderr, "%s: ok to transfer\n", *argv);
  125.  
  126.   output (start);
  127.   output (start >> 8);
  128.   output (end);
  129.   output (end >> 8);
  130.  
  131.   fputc (start, file);
  132.   fputc (start >> 8, file);
  133.  
  134.   length = (end - start) & 65535;
  135.  
  136.   if (!length) length = 65536;
  137.  
  138.   receive (buffer, length);
  139.   fwrite (buffer, 1, length, file);
  140.  
  141.   prclose ();
  142.  
  143.   return 0;
  144. }
  145.